package com.cheng.gateway;

/**
 * @author cheng-qiang
 * @date 2022年08月29日15:34
 */
public class 漏桶算法 {
    public long timeStamp = System.currentTimeMillis();  // 当前时间
    public long capacity; // 桶的容量
    public long rate; // 水漏出的速度
    public long water; // 当前水量(当前累积请求数)

    /**
     * 算法解析：
     *         （1）未满加水：通过代码 water +=1进行不停加水的动作。
     *         （2）漏水：通过时间差来计算漏水量。
     *         （3）剩余水量：总水量-漏水量。
     * @author cheng-qiang
     * @date 2022/8/29 15:35
     * @return boolean
     */
    public boolean grant() {
        long now = System.currentTimeMillis();
        // 先执行漏水，计算剩余水量
        water = Math.max(0, water - (now - timeStamp) * rate);
        timeStamp = now;
        if ((water + 1) < capacity) {
            // 尝试加水,并且水还未满
            water += 1;
            return true;
        } else {
            // 水满，拒绝加水
            return false;
        }
    }
}
